//
//  AppDelegate.swift
//  XMGWB
//
//  Created by xiaomage on 15/11/6.
//  Copyright © 2015年 xiaomage. All rights reserved.
//

import UIKit
import AFNetworking

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // 1.设置全局外观
        // 一般情况下设置全局性的属性, 最好放在AppDelegate中设置, 这样可以保证后续所有的操作都是设置之后的操作

        UITabBar.appearance().tintColor = UIColor.orangeColor()
        UINavigationBar.appearance().tintColor = UIColor.orangeColor()
        
        // 2.注册通知, 监听根控制器的改变
        NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("switchRootViewController:"), name: XMGRootViewControllerChnage, object: nil)
        
        // 3.创建keywindow
        window = UIWindow(frame: UIScreen.mainScreen().bounds)
        window?.backgroundColor  = UIColor.whiteColor()
        window?.rootViewController = defaultViewController()
        window?.makeKeyAndVisible()
        
        // 4.连接打开数据库
        SQLiteManager.shareIntance.openDB("status.sqlite")
        
        // 5.用户启动程序后,判断是有有缓存三天的数据.如果有,则删除三天的缓存的数据
        StatusViewModelList.clearData()
        
        return true
    }
    
    deinit
    {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
}

/// 切换根控制器的代码
extension AppDelegate
{
    /// 切换根控制器器
    @objc private func switchRootViewController(notify: NSNotification)
    {
        guard let _ = notify.userInfo else
        {
            // 切换到首页
            window?.rootViewController = createViewController("Main")
            return
        }
        // 切换到欢迎界面
        window?.rootViewController = createViewController("WelcomeViewController")
        
    }
    
    /// 返回默认控制器
    private func defaultViewController() -> UIViewController
    {
        if let _ = UserAccount.loadUserAccount()
        {
            return isNewVersion() ? createViewController("NewfeatureViewController") : createViewController("WelcomeViewController")
        }
        return createViewController("Main")
    }
    
    /// 根据一个SB的名称创建一个控制器
    private func createViewController(viewControllerName: String) -> UIViewController
    {
        let sb = UIStoryboard(name: viewControllerName, bundle: nil)
        return sb.instantiateInitialViewController()!
    }
    
    /// 判断是否有新版本
    private func isNewVersion() -> Bool
    {
        // 1.从info.plist中获取当前软件的版本号
        let currentVersion = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"] as! String
        
        // 2.从沙盒中获取以前的软件版本号
        let userDefaults = NSUserDefaults.standardUserDefaults()
        let sanboxVersion = (userDefaults.objectForKey("CFBundleShortVersionString") as? String) ?? "0.0"
        
        // 3.利用"当前的"和"沙盒的"进行比较
        // 如果当前的 > 沙盒的, 有新版本
        // 1.0 0.0
        if currentVersion.compare(sanboxVersion) == NSComparisonResult.OrderedDescending
        {
            // 有新版本
            // 4.存储当前的软件版本号到沙盒中
            userDefaults.setObject(currentVersion, forKey: "CFBundleShortVersionString")
            userDefaults.synchronize() // iOS7以前需要这样做, iOS7以后不需要了
            return true
        }
        
        // 5.返回结果
        return false
        
    }

}

/*
自定义LOG的目的:
在开发阶段自动显示LOG
在发布阶段自动屏蔽LOG
*/
func NJLog<T>(message: T, method: String = __FUNCTION__, line: Int = __LINE__)
{
    #if DEBUG
    print("\(method)[\(line)]: \(message)")
    #endif
}
// 函数的默认值: 如果调用者没有传递对应的参数, 那么系统就会使用默认值, 如果调用者传递了参数, 那么就会使用传递的参数
/*
由于编译器可以通过赋值的类型自动推导出数据的真实类型, 所以在Swift开发中, 能不写数据类型就不写数据类型
优点: 可以减少冗余代码
*/
/*
泛型
如果想在函数中使用泛型, 那么必须告诉系统者是一个泛型函数
func 函数名称<T>(形参列表) -> 返回值类型
{
}
message : T
T具体是什么类型由调用者来确定, 调用者传递的是什么类型, T就是什么类型
*/
 
//        print(__FILE__) // 获取当前print所在的文件路径
//        print(__FUNCTION__) // 获取当前print所在的方法名称
//        print(__LINE__) // 获取当前print所在的行号


// 通过一个标记来控制是否打印LOG
//        flag = false

